/* server.c - servidor minimo que utiliza a dll para receber uma mensagem. */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>

#include "dll.h"
#include "server.h"
#include "our/tier_app.h"

FILE *fserver = NULL;
packet_t pkt;

extern int numseq;

int main(int argc, char* argv[])
{
    fprintf(stdout,"\nServidor iniciado\n\n\n");
    
	app_server_init();
    
    fprintf(stdout,"\n\nServidor terminado com sucesso.\n\n\n");
    
    return 0;
}

/*
 * Inicia o servidor e recebe a primeira messagem do cliente.
 * Se o cabecalho contiver o caractere s, o servidor ira enviar um arquivo.
 * Se o cabecalho contiver o caractere r, o servidor ira receber um arquivo.
*/
void app_server_init()
{
    int msglen;
    char h;

    pkt = app_init();

    msglen = app_recv(&pkt);
    assert(pkt);
    pkt[msglen] = 0;
    h = app_get_h(&pkt);

    if( h == 'e' )
    {
        fprintf(stderr, "%s", pkt + APP_H);
        app_end(&pkt);
        exit(1);
    }

    assert( h == 's' || h == 'r' );

    if( h == 's' )
    {
	    fserver = fopen(pkt + APP_H, "w");
	    if( !fserver )
        {
		    char error[MAX_FNAME + 50];
		    sprintf(error, "O servidor nao conseguiu abrir o arquivo %s (%c)\n", pkt + APP_H, h);
		    app_fileerror(error, &pkt);
		    app_end(&pkt);
		    exit(1);
	    }
	    app_cs_recv(&pkt, &fserver);
    } 
    else if( h == 'r' )
    {
	    fserver = fopen(pkt + APP_H, "r");
	    if( !fserver )
        {
	    	char error[MAX_FNAME + 50];
		    sprintf(error, "O servidor nao conseguiu abrir o arquivo %s (%c)\n", pkt + APP_H, h);
		    app_fileerror(error, &pkt);
		    app_end(&pkt);
		    exit(1);
	    }
	    app_cs_send(&pkt, &fserver);
    }
}
